﻿#pragma once

#include <boost/signal.hpp>
#include <boost/function.hpp>
#include <vector>
#include <queue>

#include "../domain/models/CardsCollection.h"
#include "../domain/models/Player.h"
#include "../views/abstract/IBoardView.h"
#include "../utils/logging/ILogger.h"

/*
* Kontrolery
*/
namespace Controllers {
	/*
	* Klasa nadrzedna dla wszystkich kontrolerów
	*/
	class Controller
	{
	protected:
		Controller();
		std::vector<boost::signals::connection> connections; /**< Wektor podłączonych wydarzeń do kontrolera */
		Utils::Logging::ILogger* logger; /**< Obiekt logujacy wydarzenia */

	public:
		/** Rozłącza podłączone zdarzenie */
		virtual ~Controller();

		/**
		* Służy do bezpiecznego podłączania slotów do sygnałów.
		* Gwarantuje, że slot zostanie rozłączony po destrukcji kontrolera
		* @param signal Sygnał, do którego podłaczany jest slot
		* @param slot Slot podłączany do sygnału
		*/
		template<typename T>
		boost::signals::connection connectEvent(boost::signal<T>& signal, boost::function<T> slot)
		{
			boost::signals::connection connection = signal.connect(slot);
			connections.push_back(connection);
			return connection;
		}
	};
}

